Como estudiantes de universidad y futuros agentes de cambio en nuestra área de estudio, debemos prepararnos no solo de manera académica, sino también en lo que concierne al cuidado personal y la salud siendo de vital importancia tener buenos hábitos alimenticios para tener una vida plena y sana. Sin embargo la escasez de información y un desinterés por mantener un buen consumo alimenticio.
Objetivo del proyecto
Se recolectaron datos nutrimentales de un estudiante de universidad de primer semestre durante aproximadamente 11 semanas donde se registró el contenido calórico, carbohidratos, proteínas, lípidos(Grasas) y el sodio de cada alimento consumido por este periodo de tiempo, para que de esta manera podamos predecir el contenido calórico de un alimento en relación a cada grupo de macronutrientes que este contenga.
De la misma manera, el presente estudio pretende establecer una predicción del contenido calórico de un alimento en base a los macronutrientes de este mismo, con base a los que más aportan a este rubro. Es decir buscar qué macronutriente aporta más al aumento del contenido calórico.
¿Por qué realizamos este proyecto?
Como mencionamos anteriormente, el tener una dieta sana es de suma importancia para el cuidado personal, sin embargo no es tan sencillo tomar decisiones sin un conocimiento o con escasa información. Se pretende que este estudio ayude al usuario a tomar decisiones sobre su consumo alimenticio y así aportar a mejorar su dieta.
Metodología
El presente informe se realizó utilizando las herramientas de Quarto para la realización del reporte y el lenguaje de programación de R para el análisis de los datos obtenidos. Fue dividido en 4 secciones principales con el fin de facilitar su lectura al usuario. A continuación se da un resumen rápido de todas las secciones.
Análisis exploratorio: En esta sección tiene el fin de conocer y comprender cómo se comportan los datos que tenemos de manera general.
Análisis por variable: Analizamos el comportamiento de las variables respecto al contenido calórico, así como un modelo de regresión lineal simple para analizar la relación de las variables con respecto al contenido calórico de los alimentos. Así como una comparativa del comportamiento de todas las variables.
Modelos de predicción para calorías: Utilizando todas las variables, ajustamos diferentes modelos con el fin de encontrar un modelo que se adapte de mejor manera a los datos obtenidos y de esta manera poder realizar predicciones del contenido calórico.
Predicciones: Utilizando los modelos de predicción anteriores, realizamos una predicción con algunos datos preestablecidos para conocer el contenido calórico de cualquier alimento.
Convertimos todos los caracteres como factores, para poder operarlos.
#Convertimso caracteres a factornutri %>%mutate(across(where(is.character), as_factor))
Parte 1. Analisis Exploratorio de los datos
Parte 1.2. Obtenemos el total de alimentos
En la siguiente tabla apreciamos las diferentes tipos de alimentos consumidos en total durante el registro de los datos junto con sus propiedades.
#Obtenemos las columans que deseamos separarsepara <- nutri %>%select(alimento, contenido_calorico, carbohidratos, proteinas, lipidos, sodio) %>%na.omit()aliemntos <- separa %>%# Esta variable la utilizaremos para usar el topdistinct()paged_table(aliemntos, options =list(rows.print =10, cols.print =6))
Todos los alimentos presentes
Parte 1.3. Obtenemos la media total de nuestras variables
Analizamos el promedio de calorias, carbohidratos, proteinas, grasas y sodio totales.
#Obtenemso el premdio de nuestaras variablesvalores_medios <- nutri %>%summarize(calorias =mean(contenido_calorico), # Media caloriascarbohidratos =mean(carbohidratos, na.rm =TRUE), # Media carbohidratosproteinas =mean(proteinas, na.rm =TRUE), # Media proteinasgrasas =mean(lipidos, na.rm =TRUE), # Media grasassodio =mean(sodio, na.rm =TRUE)) # Media sodiovalores_medios %>%kable(digits =3, format.args =list(big.mark =",")) #Lo mostramos en una tabla
calorias
carbohidratos
proteinas
grasas
sodio
225.932
21.579
11.036
28.724
454.764
Promedio total de todos los datos recopilados
Parte 1.4. Resumenes estadísticos
En la siguiente sección, se presentarán los resúmenes estadísticos de cada columna, es decir obtenemos el valor mínimo, el máximo, el promedio y la mediana de cada columna del total de datos recopilados.
Parte 1.5. Realizamos un top respecto a cada columna
Como parte de nuestro análisis, realizamos un top 10 de los alimentos que contienen más de cada microalimento.
Top 10 alimentos con más calorías
cal <- aliemntos %>%select(alimento, contenido_calorico) %>%#Sepramso losa liemtos y las caloriasslice_max(order_by = contenido_calorico, n =10) #HAcemos el top 10cal %>%kable(digits =3,format.args =list(big.mark =",")) #Lo mostramos en una tabla
alimento
contenido_calorico
double western bacon
1,060
Costillas de cerdo
960
sushi
830
tacos de carne
570
torta cubana
558
pizza
488
chilaquiles
443
flautas
420
pan dulce
400
pozole
365
Top 10 alimentos con más carbohidratos
car <- aliemntos %>%select(alimento, carbohidratos) %>%slice_max(order_by = carbohidratos, n =10)car %>%kable(digits =3,format.args =list(big.mark =","))
Parte 2.1. Preparación de modelo y Preprocesamiento
Para realizar la comprobación de variables, ajustaremos una regresión lineal para cada variable respecto a las calorías
Parte 2.1.1. Preparamos las variables que usaremos
#Entrenamos el modelonutri_split <-initial_split(separa, strata = contenido_calorico)#Declaramos los datos para entrenamientonutri_train <- nutri_split %>%training()ntru_test <- nutri_split %>%testing()
Parte 2.1.2. Preparamos la receta
Una vez obtenida la receta podemos realizar las operaciones que deseemos, en este caso realizaremos una regresión lineal por cada columna de tal manera que podamos utilizar esta receta para todos los casos.
receta <-recipe(contenido_calorico ~ ., data = nutri_train) %>%#Asigna los roles correspodientes. CON TODAS LAS VARIABLESstep_other(alimento,threshold =0.15) %>%#Los aprametros siguienets son necesarios para los mdoelos KKNNstep_nzv(all_predictors()) %>%step_dummy(all_nominal_predictors()) %>%step_normalize(all_numeric_predictors())
Parte 2.1.3. Realizamos un preprocesamiento de los datos
Antes de realizar con profundidad los datos, podemos realizar una pequeña aproximación de lo que podemos obtener los datos, para esto utilizaremos la receta creada y lo pondremos en un gráfico.
Como podemos apreciar en la gráfica, vemos una relación directa entre que, a amyor carbohidratos, mayor calorías, sin embargo es de vital importancia no quedarnos solo con esta información sin una comprobación, para ello realizaremos una regresión lineal simple por cada variable.
Parte 2.2. Regresión lineal de las variables
Parte 2.2.1. Regresión lineal correspondiente a carbohidratos
carbo_split <-initial_split(data_carbo) #Divide los datos en 3/4# Asiganmos los verdadreos y entrenamientocarbo_train <-training(carbo_split) #Asignamso lo q entrenaremoscarbo_test <-testing(carbo_split) #Asigna la evaluacion# Declaramos un modelo Lineallr_carbo <-linear_reg() %>%set_engine('lm') %>%set_mode('regression')# Ajustamos el modelolr_fit_carbo <- lr_carbo %>%fit(contenido_calorico ~ ., data = carbo_train) #entranamos el modeloprint(lr_fit_carbo)
parsnip model object
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Coefficients:
(Intercept) carbohidratos
64.474 7.335
Obtenemos un Resumen rapido del modelo
En la siguiente sección podemos apreciar un resumen rápido del modelo, este nos sirve para tener una idea previa de los resultados que obtuvimos.
summary(lr_fit_carbo$fit) %>%print()
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Residuals:
Min 1Q Median 3Q Max
-253.59 -76.20 -20.65 62.83 719.49
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 64.4743 13.9437 4.624 6.23e-06 ***
carbohidratos 7.3349 0.5063 14.486 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 129.6 on 234 degrees of freedom
Multiple R-squared: 0.4728, Adjusted R-squared: 0.4705
F-statistic: 209.8 on 1 and 234 DF, p-value: < 2.2e-16
Las siguientes metrcias nos presentaran que tan bueno o que tan malo es el modelo
metricas_carbo <-metrics(lr_results_carbo, truth = contenido_calorico, estimate = .pred)metricas_carbo %>%kable(digits =3, format.args =list(big.mark =",")) #Lo mostramos en una tabla
.metric
.estimator
.estimate
rmse
standard
128.729
rsq
standard
0.379
mae
standard
87.742
Metricas del modelo de carbohdratos
Interpretacion de las metricas de carbohidratos
Coeficiente de determinación (RSQ): Nos indica que tan bueno es un modelo de predicción con valores entre 1 y 0. Siendo 0 muy malo y 1 muy bueno. Es importante mencionar que cada vez que se ejecute el código fuente del presente informe, estos valores cambiarán debido a que R toma diferentes valores cada vez que se ejecuta el script.
Distancia media cuadrática mínima (RMSE): Nos indica que tan bueno es un modelo de predicción, con al diferencia que este se da en valores numéricos reales de 0 a cualquier número donde x = 0 .Donde 0 es mejor y mientras más se aleje el valor del cero, menor será su nivel de predicción.
Finalmente podemos realziar una grafica del modelo
prote_split <-initial_split(data_prote) #Divide los datos en 3/4# Asiganmos los verdadreos y entrenamientoprote_train <-training(prote_split) #Asignamso lo q entrenaremosprote_test <-testing(prote_split) #Asigna la evaluacion# Declaramos un modelo Lineallr_prote <-linear_reg() %>%set_engine('lm') %>%set_mode('regression')# Ajustamos el modelolr_fit_prote <- lr_prote %>%fit(contenido_calorico ~ ., data = prote_train) #entranamos el modeloprint(lr_fit_prote)
parsnip model object
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Coefficients:
(Intercept) proteinas
201.198 2.694
Obtenemos un Resumen rapido del modelo
En la siguiente seccion podemos apreciar un resumen rapido del modelo, este nso sirve para tener una diea previa de los resulatdos que obtuvimos
summary(lr_fit_prote$fit) %>%print()
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Residuals:
Min 1Q Median 3Q Max
-754.67 -91.61 -37.25 28.74 715.69
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 201.1978 13.0774 15.385 < 2e-16 ***
proteinas 2.6944 0.5405 4.985 1.2e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 174 on 234 degrees of freedom
Multiple R-squared: 0.09602, Adjusted R-squared: 0.09215
F-statistic: 24.85 on 1 and 234 DF, p-value: 1.204e-06
Las siguientes metrcias nos presentaran que tan bueno o que tan malo es el modelo
metricas_prote <-metrics(lr_results_prote, truth = contenido_calorico, estimate = .pred)metricas_prote %>%kable(digits =3, format.args =list(big.mark =",")) #Lo mostramos en una tabla
.metric
.estimator
.estimate
rmse
standard
128.122
rsq
standard
0.493
mae
standard
91.181
Metricas del modelo de proteinas
Interpretacion de las metricas de proteinas
Coeficiente de determinación (RSQ): Nos indica que tan bueno es un modelo de predicción con valores entre 1 y 0. Siendo 0 muy malo y 1 muy bueno. Es importante mencionar que cada vez que se ejecute el código fuente del presente informe, estos valores cambiarán debido a que R toma diferentes valores cada vez que se ejecuta el script.
Distancia media cuadrática mínima (RMSE): Nos indica que tan bueno es un modelo de predicción, con al diferencia que este se da en valores numéricos reales de 0 a cualquier número donde x = 0 .Donde 0 es mejor y mientras más se aleje el valor del cero, menor será su nivel de predicción.
Finalmente podemos realziar una grafica del modelo
Nuestra gráfica nos muestra de manera visual cómo se comporta el modelo (Lineal roja delgada) y como las variable se relacionan para este modelo, junto cona visualización del error que el modelo tiene.
Parte 2.2.3. Regresion lineal correspondiente a lipidos
lipidos_split <-initial_split(data_lipidos) #Divide los datos en 3/4# Asiganmos los verdadreos y entrenamientolipidos_train <-training(lipidos_split) #Asignamso lo q entrenaremoslipidos_test <-testing(lipidos_split) #Asigna la evaluacion# Declaramos un modelo Lineallr_lipidos <-linear_reg() %>%set_engine('lm') %>%set_mode('regression')# Ajustamos el modelolr_fit_lipidos <- lr_lipidos %>%fit(contenido_calorico ~ ., data = lipidos_train) #entranamos el modeloprint(lr_fit_lipidos)
parsnip model object
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Coefficients:
(Intercept) lipidos
209.3256 0.4546
Obtenemos un Resumen rápido del modelo
En la siguiente sección podemos apreciar un resumen rápido del modelo, este nos sirve para tener una idea previa de los resultados que obtuvimos
summary(lr_fit_lipidos$fit) %>%print()
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Residuals:
Min 1Q Median 3Q Max
-183.46 -88.16 -48.98 21.36 824.76
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 209.3256 11.9703 17.487 <2e-16 ***
lipidos 0.4546 0.1585 2.869 0.0045 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 168.7 on 234 degrees of freedom
Multiple R-squared: 0.03397, Adjusted R-squared: 0.02984
F-statistic: 8.228 on 1 and 234 DF, p-value: 0.004501
Las siguientes metrcias nos presentaran que tan bueno o que tan malo es el modelo
metricas_lipidos <-metrics(lr_results_lipidos, truth = contenido_calorico, estimate = .pred)metricas_lipidos %>%kable(digits =3, format.args =list(big.mark =",")) #Lo mostramos en una tabla
.metric
.estimator
.estimate
rmse
standard
178.962
rsq
standard
0.032
mae
standard
104.937
Metricas del modelo de lipidos
Interpretacion de las metricas de lipidos
Coeficiente de determinación (RSQ): Nos indica que tan bueno es un modelo de predicción con valores entre 1 y 0. Siendo 0 muy malo y 1 muy bueno. Es importante mencionar que cada vez que se ejecute el código fuente del presente informe, estos valores cambiarán debido a que R toma diferentes valores cada vez que se ejecuta el script.
Distancia media cuadrática mínima (RMSE): Nos indica que tan bueno es un modelo de predicción, con al diferencia que este se da en valores numéricos reales de 0 a cualquier número donde x = 0 .Donde 0 es mejor y mientras más se aleje el valor del cero, menor será su nivel de predicción.
Finalmente podemos realziar una grafica del modelo
Nuestra gráfica nos muestra de manera visual cómo se comporta el modelo (Lineal roja delgada) y como las variable se relacionan para este modelo, junto cona visualización del error que el modelo tiene.
Parte 2.2.4. Regresion lineal correspondiente a sodio
sodio_split <-initial_split(data_sodio) #Divide los datos en 3/4# Asiganmos los verdadreos y entrenamientosodio_train <-training(sodio_split) #Asignamso lo q entrenaremossodio_test <-testing(sodio_split) #Asigna la evaluacion# Declaramos un modelo Lineallr_sodio <-linear_reg() %>%set_engine('lm') %>%set_mode('regression')# Ajustamos el modelolr_fit_sodio <- lr_sodio %>%fit(contenido_calorico ~ ., data = sodio_train) #entranamos el modeloprint(lr_fit_sodio)
parsnip model object
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Coefficients:
(Intercept) sodio
175.98935 0.09063
Obtenemos un Resumen rapido del modelo
En la siguiente seccion podemos apreciar un resumen rapido del modelo, este nso sirve para tener una diea previa de los resulatdos que obtuvimos
summary(lr_fit_sodio$fit) %>%print()
Call:
stats::lm(formula = contenido_calorico ~ ., data = data)
Residuals:
Min 1Q Median 3Q Max
-227.25 -72.17 -30.65 54.01 695.50
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 175.98935 10.84088 16.234 < 2e-16 ***
sodio 0.09063 0.01391 6.516 4.37e-10 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 139.8 on 234 degrees of freedom
Multiple R-squared: 0.1536, Adjusted R-squared: 0.15
F-statistic: 42.46 on 1 and 234 DF, p-value: 4.372e-10
Las siguientes metrcias nos presentaran que tan bueno o que tan malo es el modelo
metricas_sodio <-metrics(lr_results_sodio, truth = contenido_calorico, estimate = .pred)metricas_sodio %>%kable(digits =3, format.args =list(big.mark =",")) #Lo mostramos en una tabla
.metric
.estimator
.estimate
rmse
standard
208.101
rsq
standard
0.220
mae
standard
115.342
Metricas del modelo de sodio
Interpretacion de las metricas de sodio
Coeficiente de determinación (RSQ): Nos indica que tan bueno es un modelo de predicción con valores entre 1 y 0. Siendo 0 muy malo y 1 muy bueno. Es importante mencionar que cada vez que se ejecute el código fuente del presente informe, estos valores cambiarán debido a que R toma diferentes valores cada vez que se ejecuta el script.
Distancia media cuadrática mínima (RMSE): Nos indica que tan bueno es un modelo de predicción, con al diferencia que este se da en valores numéricos reales de 0 a cualquier número donde x = 0 .Donde 0 es mejor y mientras más se aleje el valor del cero, menor será su nivel de predicción.
Finalmente podemos realziar una grafica del modelo
A continuación se realiza una comparación de los resultados de las regresiones lineales de cada variable respecto a las calorías, para esto realizaremos una comparación de gráficas para que de esta manera podamos apreciar visualmente cómo se comportan las variables de manera individual respecto al contenido calórico y cual puede llegar a aportar más a la distribución de las calorías en los alimentos.
comp <-bind_rows(lr_results_carbo, lr_results_prote, lr_results_lipidos, lr_results_sodio) %>%ggplot(aes(x = .pred, y = contenido_calorico, color = respecto)) +geom_point(alpha =0.1) +geom_abline(color ="darkred") +facet_wrap(~ respecto) +#significa que voy a realizar facetas para cada modelo.theme(legend.position ="none")ggplotly(comp)
Comparacion visual de las regresiones de cada variable
Parte 3. Modelos de predicción para calorías
A continuación se presentan 4 modelos de predicción con diferentes algoritmos para realizar esta comprobación, el fin de hacer 4, es buscar qué modelo se ajusta mejor a nuestro datos para de esta manera tener predicciones más certeras usando el modelo mejor adaptado.
Parte 3.1. Realizamos un modelo de regresion lineal multiple
Grafico del modelo de Regresion Lineal Generalizada
Parte 3.5. Realziamos una comapracion visual de los modelos
A continuacion se presentan los modelos realziados para tener un mejor visualziacion al moemnto de comprarlos y determianr que modelos e ajusta mejor
comp_models <-bind_rows(lr_results, rf_results, kknn_results, rgl_results) %>%ggplot(aes(x = .pred, y = contenido_calorico, color = model)) +geom_point(alpha =0.1) +geom_abline(color ="darkred") +facet_wrap(~ model) +#significa que voy a realizar facetas para cada modelo.theme(legend.position ="none")ggplotly(comp_models)
Comparacion visual de los diferentes modelos de prediccion
Parte 4. Predicciones
Para este caso realizaremos una predicción con el modelo que creemos que mejor se ajuste al modelo, es importante mencionar que cada vez que se ejecuta el código fuente de este documento, los parámetros y resultados pueden cambiar, por lo que se recomienda analizar los datos sin modificar el archivo .QMD.
Datos con los que haremos la prediccion
# NOTA: Las calorias de este alimento son 100datos_prediccion <-tibble(alimento ="Nutella",carbohidratos =11,proteinas =1,lipidos =6,sodio =10)kable(datos_prediccion)
alimento
carbohidratos
proteinas
lipidos
sodio
Nutella
11
1
6
10
Realizaremos 3 predicciones con los datos precargados con los diferentes modelos.
Como podemos apreciar, utilizando el modelo de regresión lineal, nos indica que los carbohidratos son los datos que tienen una mayor importancia al momento de realizar predicciones sobre el contenido calórico de algún alimento.
Conclusiones
Una vez realizado todo el análisis podemos determinar las siguientes conclusiones de los datos recabados.
De todas las variables de un alimento, los carbohidratos son los que más aportan al incremento del contenido calórico de un alimento.
Demostración:
1.1. Podemos observar desde la regresión lineal simple entre carbohidratos y contenido calórico, teniendo en general las mejores métricas en comparativa con los demás modelos entre las variables.
1.2. En el preprocesamiento nos indicó una alta correlación entre los carbohidratos y el contenido calórico.
1.3. Al momento de realizar la predicción y analizar la importancia que tuvo cada variable para la predicción de las calorías, claramente tenemos un alto porcentaje correspondientes a carbohidratos.
1.4. Al momento de realizar la regresión lineal de los macroalimentos y compararlos visualmente, nos damos cuenta que el modelo con mejor ajuste es el correspondiente a carbohidratos.
1.5. Al ver el top alimentos con más carbohidratos y compararlo con el top de contenido calórico, podemos apreciar que hay varios alimentos que coinciden que un alto contenido en carbohidratos, son altos también en contenido calórico.
Al realizar los diferentes modelos para predecir y compararlos entre sí, el mejor modelo de predicción es Random Forest.
Demostración
2.1 El modelo de Random Forest tiene una mayor precisión a comparación de los demás modelos, esto lo podemos apreciar en las métricas del modelo, teniendo las más satisfactorias en el Random Forest.
2.2. Al momento de realizar la comparación visual de los modelos para predicción, nos damos cuenta que Random Forest se acomoda bastante bien a todos los datos para realizar predicciones, teniendo poca variación en los datos.
2.3. Al momento de realizar la predicción con un alimento al que ya conocemos sus calorías, nos damos cuenta que el modelo de Random Forest logra la mejor predicción al valor que los demás modelos.